繼上一篇介紹如何透過 Jinja 模板產生報告的 Generator 模組,本篇要來介紹負責產生檢查報告資料的 Operators 模組
Operators 模組由三個主要部分組成:
本文將重點介紹 dbt_operator,這是整個檢查過程中最關鍵的部分。
dbt_operator 的核心功能包括:
dbt_operator 能夠識別以下幾類 models:
對於每個 model,dbt_operator 能夠提取以下關鍵屬性:
alias
:對應 BigQuery 中的表名schema
:對應 BigQuery 中的 datasetdatabase
:對應 BigQuery 中的 projectmaterialized
:表示 model 在 BigQuery 中的形式(table、view 或 UDF)dbt 1.5 以上版本提供了 Python API,可以直接在 Python 中調用 DBT 命令。這大大簡化了自動化過程。
要獲取 models 的屬性,我們需要解析 DBT 的 manifest 文件。以下是一個範例:
dbt = dbtRunner()
res: dbtRunnerResult = dbt.invoke(["-q", "parse", "--profiles-dir", "."])
manifest = res.result
for node in manifest.nodes.values():
# 這裡可以訪問每個 model 的屬性# 例如:node.alias, node.database, node.schema 等
dbt ls
命令是檢索特定 models 的強大工具。以下是使用範例:
# 撈取 SQL 有異動的 models
dbt ls --select state:modified.body --state base --target-path target
# 撈取有使用異動 macros 的 models
dbt ls --select state:modified.macros --state base --target-path target
# 撈取異動 models 下游 models
dbt ls --select state:modified.body+ --state base --target-path target
# 撈取異動 models 相關 exposure
dbt ls --select state:modified+ --resource-type exposure --state base --target-path target
在 python 上使用 dbtRunner 就能執行同樣的 cli 指令
dbt = dbtRunner()
args = ["-q", "ls", "--models", "state:modified.body",
"--state", "base",
"--target-path", "target"
"--output", "name"]
res: dbtRunnerResult = dbt.invoke(args=args)
result = res.result
dbt_operator 是 pr-check 套件中的核心模組,為後續的檢查過程提供必要的數據。利用 dbt 的 Python API 和 dbt ls
命令,可以識別需要檢查的 models 並獲取它們的屬性。
在下一篇文章中,我們將繼續介紹另一個模組:git_diff_operator。